//template<class T>
//class Shared_ptr
//{
//public:
//	Shared_ptr(T* ptr=nullptr):ptr_(ptr), pRefCount_(new int(1)),pmtx_(new mutex)
//	{	
//	}
//	//拷贝构造
//	Shared_ptr(const Shared_ptr<T>& other):ptr_(other.ptr_),pRefCount_(other.pRefCount),pmtx_(ohter.pmtx_)
//	{
//		AddRef();
//	}
//	Shared_ptr<T>& operator=(const Shared_ptr<T>other)
//	{
//		if (ptr_!=other.ptr_)//防止重复计数
//		{
//			Release();
//			ptr_ = other.ptr_;
//			pmtx_ = other.ptr_;
//			pRefCount_ = other.ptr_;
//			AddRef();
//		}
//		return *this;
//	}
//	~Shared_ptr()
//	{
//		Release();
//	}
//	void Release()
//	{
//		pmtx_->lock();
//		bool flag = false;//!!!!!!!!!!!!这里删除锁 是一种思路 先确保 成员已经删除 跳出锁再删除锁
//		if (--(*pRefCount_)==0&&ptr_)
//		{
//			delete ptr_;
//			delete pRefCount_;
//			flag = true;
//		}
//		pmtx->unlock();
//		if (flag==true)
//		{
//			delete pmtx_;
//		}
//	}
//	void AddRef()
//	{
//		pmtx_->lock();
//		(*pRefCount_)++;
//		pmtx_->unlock();
//	}
//	int use_count()
//	{
//		return *pRefCount_;
//	}
//	T* operator*()
//	{
//		return ptr_;
//	}
//	T& operator->()
//	{
//		return *ptr_;
//	}
//
//	
//private:
//	T* ptr_;
//	int *pRefCount_;//这里首先不能定义为 int 型 因为int属于单个类  也不能变成static因为static 属于所有类就不只是正在shared的指针
//	                //所以使用一个指针 每一个share 指向一个公共的计数
//	mutex* pmtx_;
//};
//struct Date
//{
//	int year;
//	int mon;
//};
//int main()
//{
//	Shared_ptr<Date>sp1(new Date);
//  shared_ptr<int> sp2(sp1);
//	return 0;
//}
//weak_ptr 就是shared_ptr简化版本   拷贝构造 拷贝的是一个shared_ptr对象& 复制重载 重载对象是一个shared_ptr对象
//指针计数是线程安全的 但是指向的资源不是线程安全